home *** CD-ROM | disk | FTP | other *** search
/ Language/OS - Multiplatform Resource Library / LANGUAGE OS.iso / yerk / mps231ss.hqx / Mops source / Asm Source / ic1 < prev    next >
Text File  |  1992-09-13  |  8KB  |  446 lines

  1. \ Instruction Classes           Reese Warner                    3/85
  2. \      8/85  RW   added comments
  3. \      8/85  RW   Added Neon mode
  4. \      9/85  RW   Added type 26, sized single ea instruction
  5. \      9/85  RW   Added type27, for the STOP instruction
  6. \     12/85  JF   fixed LENGTH: method on TYPE3
  7. \  03/07/86  GDC  fixed type 7 BUILD:
  8. \  2-Oct-86  MRH  fixed type4 BUILD:
  9. \ 11-May-87  MRH  added range checking for immediates, shifts, ADDQ, SUBQ
  10. \  9-Aug-87  MRH  fixed type9 BUILD:
  11.  
  12. 0 -> dlevel
  13.  
  14. :CLASS machInst    super(  object  )
  15.  
  16.     var bytecode
  17.     int srcMask
  18.     int dstMask
  19.     int theSize
  20.  
  21. :M INIT:  { opcode -- }
  22.     opcode put: bytecode
  23.     hex
  24.     intrp1  put: srcMask        \ reads sourcemask
  25.     intrp1  put: dstMask        \ reads destination mask
  26.     intrp1  put: theSize        \ reads the default machine code size
  27.     decimal
  28. ;M
  29.  
  30. :M BC:        \ debug
  31.     hex get: bytecode ." bytecode is " u. cr decimal
  32. ;M
  33.  
  34. :M MASKS:    \ debug
  35.     hex get: srcMask ." src is " u. cr
  36.     get: dstMask ." dst is " u. cr  decimal
  37. ;M
  38.  
  39. :M OPFMT:
  40.     get: theSize
  41. ;M
  42.  
  43. :m PRINT:
  44.     ." class is "  .class: self  cr
  45.     bc: self  masks: self
  46.     ." size is "  get: theSize  .  cr  ;m
  47.  
  48. ;CLASS
  49.  
  50. \ TYPE1 - No operand instructions, such as Reset.
  51. :CLASS type1 super(  machinst  )
  52.  
  53. :M BUILD:
  54.     get: bytecode w,
  55. ;M
  56.  
  57. :M LENGTH: ( -- len )
  58.     1
  59. ;M
  60.  
  61. ;CLASS
  62.  
  63. \ TYPE2 - Register, immediate value, such as Link
  64. \  e.g. Link A0,#100
  65. :CLASS type2 super(  machinst  )
  66.  
  67. :M BUILD:   { \ workSpace -- }
  68.     op1 getOp
  69.     get: bytecode -> workSpace
  70.     workSpace reg: op1 or w,
  71.     op2 getOp
  72.     value: op2 w,
  73. ;M
  74.  
  75. :M LENGTH: ( -- len )
  76.     op1 getOp
  77.     op1 get: srcMask check
  78.     op2 getOp
  79.     op2 get: dstMask check
  80.     2
  81. ;M
  82.  
  83. ;CLASS
  84.  
  85. \ TYPE3 - Instructions that take an immediate operand, such as ANDI, EORI
  86. \  e.g. EORI.W #100,-(A4)
  87. :CLASS type3 super(  machinst  )
  88.  
  89. :M BUILD:   { \ workSpace -- }
  90.     op1 getOp
  91.     op2 getOp
  92.     get: bytecode -> workSpace
  93.     opFmt 6 << workSpace or -> workSpace
  94.     ea: op2 workspace or -> workSpace
  95.     workSpace w,
  96.     value: op1      \ immediate Data
  97.     opFmt
  98.     CASE
  99.     0    OF    249 byteChk  w,    ENDOF
  100.     1    OF    249 wordChk  w, ENDOF
  101.     ( 2, presumably )  drop  ,  0
  102.     ENDCASE
  103.     op2 compIdxMode
  104. ;M
  105.  
  106. :M LENGTH:  { \ size -- len }
  107.     op1 getOp
  108.     op1 get: srcMask check
  109.     op2 getOp
  110.     op2 get: dstMask check
  111.     2 -> size
  112.     op2 modeSize ++> size
  113.     opFmt 1- 0 max ++> size   \ '1 max' -> '1- 0 max' jaf 12/17
  114.     size
  115. ;M
  116.  
  117. ;CLASS
  118.  
  119. \ TYPE4 - Instructions that take a reg, an effective Addr, an opmode
  120. \  e.g. OR.L D0,(SP)
  121.  
  122. :CLASS type4 super(  machinst  )
  123.  
  124. :M BUILD:   { \ opMode Reg EA workSpace flag -- }
  125.     op1 getOp  op2 getOp
  126.     true -> flag
  127.      mode: op2 1 =
  128.     IF
  129.         opFmt 2 =
  130.         IF
  131.             7 -> opMode
  132.         ELSE
  133.             3 -> opMode
  134.         THEN
  135.         reg: op2 -> reg
  136.         ea: op1 -> ea
  137.         false -> flag
  138.     THEN
  139.     mode: op2 0=  flag and
  140.     get: srcMask 1 <> and       \ Don't let EOR Dm,Dn come here - MRH
  141.     IF
  142.         opFmt -> opMode
  143.         reg: op2 -> reg
  144.         ea: op1 -> ea
  145.         false -> flag
  146.     THEN
  147.     mode: op1 0= flag and
  148.     IF
  149.         opFmt 4+ -> opMode
  150.         reg: op1 -> reg
  151.         ea: op2 -> ea
  152.         false -> flag
  153.     THEN
  154.     flag
  155.     IF
  156.         219 asmERROR   \ at least one operand must be a register direct
  157.     THEN
  158.     get: bytecode -> workSpace
  159.     reg 9 << workSpace or -> workspace
  160.     opMode 6 << workSpace or -> workSpace
  161.     ea workSpace or -> workSpace
  162.     workSpace w,
  163.     op1 compIdxMode
  164.     op2 compIdxMode
  165. ;M
  166.  
  167. :M LENGTH:  { \ len -- len }
  168.     op1 getOp
  169.     op1 get: srcMask check
  170.     op2 getOp
  171.     op2 get: dstMask check
  172.     1 -> len
  173.     op1 modesize ++> len
  174.     op2 modesize ++> len
  175.     len
  176. ;M
  177.  
  178. ;CLASS
  179.  
  180. \ TYPE5 - reg & ea, unsized e.g. LEA <ea>,A3
  181. :CLASS type5 super(  machinst  )
  182.  
  183. :M BUILD:   { \ workSpace -- }
  184.     op1 getOp
  185.     op2 getOp
  186.     get: bytecode -> workSpace
  187.     reg: op2 9 << workSpace or -> workSpace
  188.     ea: op1 workSpace or -> workSpace
  189.     workSpace w,
  190.     op1 compIdxMode
  191. ;M
  192.  
  193. :M LENGTH:  ( -- len )
  194.     op1 getOp
  195.     op1 get: srcMask check
  196.     op2 getOp
  197.     op2 get: dstMask check
  198.     1 op1 modeSize +
  199. ;M
  200.  
  201. ;CLASS
  202.  
  203. \ TYPE6 - Branch instructions - Bcc, BRA, BSR
  204.  
  205. :CLASS type6 super(  machinst  )
  206.  
  207. :M BUILD:
  208.     op1 getOp  get: bytecode
  209.     op1 abs: operand  dup  NIF  245 asmError  THEN    \ wrong mode
  210.     here 2+ -
  211.     opFmt Sfmt =
  212.     IF    250 byteChk  $ FF and or  w,
  213.     ELSE    swap  w,  250 wordChk  w,
  214.     THEN
  215. ;M
  216.  
  217. :M LENGTH:
  218.     op1 getOp
  219.     op1 get: srcMask check
  220.     opFmt Sfmt = IF  1  ELSE  2  THEN
  221. ;M
  222.  
  223. ;CLASS
  224.  
  225. \ TYPE7 - Bit test operations: BCLR,BSET,BTST,BCHG
  226. \  e.g. BTST D5,-(A4) or BTST #5,-(A4)
  227. :CLASS type7 super(  machinst  )
  228.  
  229. :M BUILD:   { \ workSpace -- }
  230.     op1 getOp
  231.     op2 getOp
  232.     get: bytecode -> workSpace
  233.     mode: op1 0=
  234.     IF
  235.         reg: op1 9 << workSPace or -> workSpace
  236.         ea: op2 workSpace or -> workSpace
  237.         256 workspace or -> workspace
  238.         workSpace w,
  239.     ELSE
  240.         ea: op2 workSpace or -> workSpace
  241.         2048 workspace or -> workSpace
  242.         workSpace w,
  243.         value: op1 w,
  244.     THEN
  245.     op2 compIdxMode
  246. ;M
  247.  
  248. :M LENGTH:  { \ len -- len }
  249.     op1 getOp
  250.     op1 get: srcMask check
  251.     op2 getOp
  252.     op2 get: dstMask check
  253.     mode: op1 0=
  254.     IF
  255.         1 -> len
  256.     ELSE
  257.         2 -> len
  258.     THEN
  259.     len
  260. ;M
  261.  
  262. ;CLASS
  263.  
  264. \ TYPE8 - single ea instructions. E.G. PEA aLabel
  265. :CLASS type8 super(  machinst  )
  266.  
  267. :M BUILD:
  268.     op1 getOp
  269.     get: bytecode  ea: op1  or  w,
  270.     op1 compIdxMode
  271. ;M
  272.  
  273. :M LENGTH:  { \ len - len }
  274.     op1 getOp
  275.     op1 get: srcMask  check
  276.     1 -> len 
  277.     op1 modeSize ++> len
  278.     len
  279. ;M
  280.  
  281. ;CLASS
  282.  
  283. \ TYPE9 - EXG A2,D4
  284. :CLASS type9 super(  machinst  )
  285.  
  286. :M BUILD:
  287.     op1 getOp
  288.     op2 getOp
  289.     reg: op2  reg: op1
  290.     mode: op1 0=  mode: op2 0=  and
  291.     IF                    \ Both D regs
  292.         $ 40
  293.     ELSE
  294.         mode: op1  mode: op2  and
  295.         IF                \ Both A regs
  296.             $ 48
  297.         ELSE                \ One D, one A
  298.             mode: op1
  299.             IF  ( A is first, but needs to be second )
  300.                 swap
  301.             THEN
  302.             $ 88
  303.         THEN
  304.     THEN
  305.     swap  9 <<  or  or  get: bytecode  or  w,
  306. ;M
  307.  
  308. :M LENGTH: ( -- len )
  309.  
  310.     op1 getOp
  311.     op1 get: srcMask check
  312.     op2 getOp
  313.     op2 get: dstMask check
  314.     1
  315. ;M
  316.  
  317. ;CLASS
  318.  
  319. \ TYPE10 - EXT.L DO
  320. :CLASS type10 super(  machinst  )
  321.  
  322. :M BUILD:   { \ work -- }
  323.     op1 getOp
  324.     get: bytecode -> work
  325.     reg: op1 work or -> work
  326.     opFmt 1+  2 max 6 << work or -> work       \ set opMode field
  327.     work w,
  328. ;M
  329.  
  330. :M LENGTH:
  331.     op1 getOp
  332.     op1 get: srcMask check
  333.     1
  334. ;M
  335.  
  336. ;CLASS
  337.  
  338.  
  339. : ShortImmAdjust    \ ( n -- n' )
  340.     dup  1 8 inRange?
  341.     IF    7 and  9 <<
  342.     ELSE    249 asmError
  343.     THEN   ;
  344.  
  345.  
  346. \ TYPE11 - Shift operations e.g. LSL.W #2,D0
  347. :CLASS type11 super(  machinst  )
  348.  
  349. :M BUILD:   { \ work val -- }
  350.     op1 getOp
  351.     get: bytecode -> work
  352.     mode: op1 11 = mode: op1 0= or
  353.     IF
  354.         opFmt 6 << work or -> work
  355.         op2 getOp
  356.         mode: op1 0=
  357.         IF
  358.             32 work or -> work
  359.             reg: op1 9 << work or -> work
  360.         ELSE
  361.             value: op1  shortImmAdjust  ++> work
  362.         THEN
  363.         reg: op2 work or -> work
  364.         work w,
  365.     ELSE
  366.         192 work or -> work
  367.         ea: op1 work or w,
  368.         op1 compIdxMode
  369.     THEN
  370. ;M
  371.  
  372. :M LENGTH: { \ len -- len }
  373.     op1 getOp
  374.     op1 get: srcMask check
  375.     mode: op1 11 = mode: op1 0= or
  376.     IF
  377.         op2 getOp
  378.         op2 get: dstMask check
  379.         1 -> len
  380.     ELSE
  381.         1 op1 modeSize + -> len
  382.     THEN
  383.     len
  384. ;M
  385.  
  386. ;CLASS
  387.  
  388. \ TYPE12 - ADDQ, SUBQ
  389. \  e.g. ADDQ.L #4,D6
  390. :CLASS type12 super(  machinst  )
  391.  
  392. :M BUILD:   { \ work -- }
  393.     op1 getOp
  394.     op2 getOp
  395.     get: bytecode -> work
  396.     value: op1  shortImmAdjust  ++> work
  397.     opFmt 6 << work or -> work
  398.     ea: op2 work or -> work
  399.     work w,
  400.     op2 compIdxMode
  401. ;M
  402.  
  403. :M LENGTH:  ( -- len )
  404.     op1 getOp
  405.     op1 get: srcMask check
  406.     op2 getOp
  407.     op2 get: dstMask check
  408.     1 op2 modeSize +
  409. ;M
  410.  
  411. ;CLASS
  412.  
  413. \ TYPE13 - ABCD, SBCD
  414. \  e.g. ABCD D1,D2 or ABCD -(A4),-(A3)
  415. :CLASS type13 super(  machinst  )
  416.  
  417. :M BUILD:       { \ work -- }
  418.     op1 getOp
  419.     op2 getOp
  420.     get: bytecode -> work
  421.     reg: op1 work or -> work
  422.     reg: op2 9 << work or -> work
  423.     mode: op1 0= not
  424.     IF
  425.         8 ++> work
  426.     THEN
  427.     work w,
  428. ;M
  429.  
  430. :M LENGTH:      { \ len -- len }
  431.     op1 getOp
  432.     op1 get: srcMask check
  433.     op2 getOp
  434.     op2 get: dstMask check
  435.     mode: op1 mode: op2 = not 
  436.     IF
  437.         207 asmError
  438.     THEN
  439.     1 -> len
  440.     op1 modesize ++> len
  441.     op2 modesize ++> len
  442.     len
  443. ;M
  444.  
  445. ;CLASS
  446.